﻿using SIIE_ERP.Codigo;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SIIE_ERP.BaseDatos.Inventarios.Catalogos
{
    public class dbo_Cat_Listas_Precios
    {
        #region Propiedades

        private string _RFC;
        private string _Usuario;

        #endregion

        #region Constructores

        public dbo_Cat_Listas_Precios(string RFC, string Usuario)
        {
            this._RFC = RFC;
            this._Usuario = Usuario;
        }

        #endregion

        #region SELECT

        public DataTable Get_Lista_Precios()
        {
            string Query = @"SELECT *  FROM dbo_Cat_Lista_Precios";
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_Top()
        {
            string Query = @"SELECT  Id_Lista_Precios FROM dbo_Cat_Lista_Precios  WHERE id_lista_Precios =  DMax('Id_Lista_Precios', 'dbo_Cat_Lista_Precios') ";
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_By_Id(object Id)
        {
            string Query = @"SELECT   * from dbo_Cat_Lista_Precios 
                             WHERE id_lista_Precios = @id_lista_Precios   ";
            Query = Query.Replace("@id_lista_Precios", Id.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_By_Nombre(string nombre)
        {
            string Query = @"SELECT  count(*) as total
                             FROM dbo_cat_lista_precios 
                             WHERE nombre = '@Nombre'";
            Query = Query.Replace("@Nombre", nombre.Replace("'", "''"));
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_Articulo(object Id_Lista_Precios)
        {
            string Query = @"SELECT A1.Id_Lista_Precios_Articulo, A1.id_articulo, A2.Nombre,A1.Tipo_Moneda,A1.Precio_Lista
                         FROM dbo_cat_lista_precios_articulo as A1, dbo_cat_articulo as A2
                         WHERE Id_Lista_Precios=@Id_Lista_Precios and
                         A1.Id_Articulo = A2.Id_articulo";
        Query = Query.Replace("@Id_Lista_Precios",Id_Lista_Precios.ToString());
        return SrvDB.ExecuteQuery_Get(Query);

        }
        public DataTable Get_Lista_Precios_Clientes(object Id_Cliente)
        {
            string Query = @"SELECT A1.Id_Lista_Precios_Cliente  , A2.Nombre, A2.Descripcion,  A1.Orden
                             FROM  dbo_cat_lista_precios_cliente as A1
                             LEFT JOIN dbo_cat_lista_precios as A2 on A1.Id_Lista_Precios = A2.Id_Lista_Precios 
                             WHERE Id_cliente = @Id_Cliente
                             ORDER BY orden";
            Query = Query.Replace("@Id_Cliente",Id_Cliente.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_Sucursal(object Id_Sucursal)
        {
            string Query = @"SELECT A1.Id_Lista_Precios_Sucursal  , A2.Nombre, A2.Descripcion,  A1.Orden
                             FROM  dbo_cat_lista_precios_sucursal as A1
                             LEFT JOIN dbo_cat_lista_precios as A2 on A1.Id_Lista_Precios = A2.Id_Lista_Precios 
                             WHERE Id_sucursal = @Id_Sucursal
                             ORDER BY orden";
            Query = Query.Replace("@Id_Sucursal", Id_Sucursal.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_Clientes_By_Id(int id_Lista_Precios,int Id_Cliente)
        {
            string Query = @"SELECT count(*) as total
                             FROM dbo_cat_lista_precios_Cliente
                             WHERE Id_lista_precios = @Id_Lista_Precios
                             and Id_cliente = @Id_Cliente";


            Query = Query.Replace("@Id_Lista_Precios", id_Lista_Precios.ToString());
            Query = Query.Replace("@Id_Cliente", Id_Cliente.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_Sucursal_By_Id(int id_Lista_Precios, int Id_Sucursal)
        {
            string Query = @"SELECT count(*) as total
                             FROM dbo_cat_lista_precios_Sucursal
                             WHERE Id_lista_precios = @Id_Lista_Precios
                             and Id_Sucursal = @Id_Sucursal";


            Query = Query.Replace("@Id_Lista_Precios", id_Lista_Precios.ToString());
            Query = Query.Replace("@Id_Sucursal", Id_Sucursal.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_Articulo_Descuento_Cantidad(int Id_Lista_Precios, int Id_Articulo, double cantidad_minima)
        {
            string Query = @"SELECT A2.cantidad_minima
                             FROM dbo_cat_lista_precios_articulo as A1, dbo_cat_lista_precios_articulo_descuento as A2, dbo_cat_lista_precios as a3
                             WHERE
                             a3.Id_Lista_Precios = @Id_Lista_Precios and
                             a1.Id_Lista_Precios = a3.Id_Lista_Precios and
                             A1.Id_Lista_Precios_Articulo = A2.Id_Lista_Precios_Articulo and
                             A1.Id_Articulo = @Id_Articulo and 
                             A2.cantidad_minima = @cantidad_minima";
            Query = Query.Replace("@Id_Lista_Precios", Id_Lista_Precios.ToString());
            Query = Query.Replace("@Id_Articulo", Id_Articulo.ToString());
            Query = Query.Replace("@cantidad_minima", cantidad_minima.ToString());

            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_lista_Precios_Articulo_Descuento(int id_Lista_Precios,int id_Articulo)
        {
            string Query = @"SELECT A3.Id_Lista_Precios_Articulo_Descuento,  A3.cantidad_minima,A3.descuento
                             FROM dbo_cat_lista_Precios as A1, dbo_cat_lista_precios_articulo as A2, dbo_cat_lista_precios_articulo_descuento as A3
                             WHERE 
                             A1.id_Lista_Precios  = A2.id_Lista_Precios  and
                             A2.id_Lista_Precios = @id_Lista_Precios  and
                             A2.id_lista_precios_articulo = A3.id_lista_precios_articulo and
                            A2.Id_Articulo = @Id_Articulo
                             
                      ";
            Query = Query.Replace("@id_Lista_Precios", id_Lista_Precios.ToString());
            Query = Query.Replace("@Id_Articulo", id_Articulo.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        }
        public DataTable Get_Lista_Precios_Articulo_By_Id(object Id_Lista_Precios,int id_Articulo)
        {
            string Query = @"SELECT A1.Id_Lista_Precios, A1.id_articulo, A2.Nombre,A1.Tipo_Moneda,A1.Precio_Lista,A1.Id_Lista_precios_Articulo
                         FROM dbo_cat_lista_precios_articulo as A1, dbo_cat_articulo as A2
                         WHERE Id_Lista_Precios=@Id_Lista_Precios and
                         A1.Id_Articulo = A2.Id_articulo and A1.id_Articulo = @Id_Articulo ";
            Query = Query.Replace("@Id_Lista_Precios", Id_Lista_Precios.ToString());
            Query = Query.Replace("@Id_Articulo", id_Articulo.ToString());
            return SrvDB.ExecuteQuery_Get(Query);

        }
        public DataTable Get_Lista_precios_Relacionados(int Id_Lista_Precios)
        {

            string Query = @"SELECT count(*) as total
                            FROM dbo_cat_lista_precios
                            WHERE Id_Lista_Precios = @Id_Lista_Precios
                            AND  @Id_Lista_Precios  IN 
                            (
                            SELECT Id_Lista_Precios from dbo_cat_lista_precios_cliente 
                             )
                            OR  @Id_Lista_Precios  IN
                              (
                            SELECT id_Lista_precios from dbo_cat_lista_precios_sucursal
                            )";
            Query = Query.Replace("@Id_Lista_Precios", Id_Lista_Precios.ToString());
            return SrvDB.ExecuteQuery_Get(Query);
        
        
        }
        #endregion

        #region INSERT
        public Respuesta Insert_Lista_Precios(string nombre, string descripcion)
        {
            try
            {
                string Query = @"insert into dbo_Cat_Lista_Precios
                                 (
                                  Id_Lista_Precios,
                                  Nombre,
                                  Descripcion,
                                  Fecha_Alta,
                                  Usuario_Alta,
                                  Fecha_Mantto,
                                  Usuario_Mantto
                                 )  values 
                                 (
                                 IIF(DCount('*', 'dbo_Cat_Lista_Precios') = 0, 1, DMax('Id_Lista_Precios', 'dbo_Cat_Lista_Precios') + 1),
                                 '@Nombre',
                                 '@Descripcion',
                                  NOW(),
                                 '@Usuario_Alta',
                                  NOW(),
                                 '@Usuario_Mantto'
                                     )";
                Query = Query.Replace("@Nombre", nombre.Replace("'", "''"));
                Query = Query.Replace("@Descripcion", descripcion.Replace("'", "''"));
                Query = Query.Replace("@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@Usuario_Mantto", this._Usuario);
                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception EX)
            {
                return new Respuesta(2, EX.Message);
            }

        }
        
        public Respuesta Insert_Lista_Precios_Articulo(int idArticulo, int Id_Lista_Precios, double precio_Lista, int tipo_Moneda)
        {
            try
            {
                string Query = @"insert into dbo_Cat_Lista_Precios_Articulo
                                 (
                                 Id_Lista_Precios_Articulo,
                                 Id_Lista_Precios,
                                 Id_Articulo,
                                 Precio_Lista,
                                 Tipo_Moneda,
                                 Fecha_Alta,
                                 Usuario_Alta,
                                 Fecha_Mantto,
                                 Usuario_Mantto
                                 )  values 
                                 (
                                 IIF(DCount('*', 'dbo_Cat_Lista_Precios_Articulo') = 0, 1, DMax('Id_Lista_Precios_Articulo', 'dbo_Cat_Lista_Precios_Articulo')+ 1 ),
                                 @Id_Lista_Precios,
                                 @Id_Articulo,
                                 @Precio_Lista,
                                 @Tipo_Moneda,
                                 NOW(),
                                 '@Usuario_Alta',
                                 NOW(),
                                 '@Usuario_Mantto'
                                  )";
                Query = Query.Replace("@Id_Articulo", idArticulo.ToString());
                Query = Query.Replace("@Id_Lista_Precios", Id_Lista_Precios.ToString());
                Query = Query.Replace("@Precio_Lista", precio_Lista.ToString());
                Query = Query.Replace("@Tipo_Moneda", tipo_Moneda.ToString());
                Query = Query.Replace("@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@Usuario_Mantto", this._Usuario);
                return SrvDB.ExecuteQuery_Insert(Query);

            }
            catch (Exception EX)
            {
                return new Respuesta(2, EX.Message);
            }
        }

        public Respuesta Insert_Lista_Precios_Articulo_Descuento(int idArticulo, double cantidad_Minima, double Descuento)
        {
            try
            {
                string Query = @"insert into dbo_Cat_Lista_Precios_Articulo_Descuento
                                 (
                                 Id_Lista_Precios_Articulo_Descuento,
                                 Id_Lista_Precios_Articulo,
                                 Cantidad_Minima,
                                 Descuento,
                                 Fecha_Alta,
                                 Usuario_Alta,
                                 Fecha_Mantto,
                                 Usuario_Mantto
                                  )  
                                 values
                                 (
                                 IIF(DCount('*', 'dbo_Cat_Lista_Precios_Articulo_Descuento') = 0, 1, DMax('Id_Lista_Precios_Articulo_Descuento', 'dbo_Cat_Lista_Precios_Articulo_Descuento')+ 1 ),
                                @Id_Lista_Precios_Articulo,
                                 @Cantidad_Minima,
                                 @Descuento,
                                 NOW(),
                                 '@Usuario_Alta',
                                 NOW(),
                                 '@Usuario_Mantto'
                                 )";
                Query = Query.Replace("@Id_Lista_Precios_Articulo",idArticulo.ToString());
               
                Query = Query.Replace("@Cantidad_Minima", cantidad_Minima.ToString());
                Query = Query.Replace("@Descuento", Descuento.ToString());
                Query = Query.Replace("@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@Usuario_Mantto", this._Usuario);
                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception EX)
            {
                return new Respuesta(2, EX.Message);
            }
        }

        public Respuesta Insert_Lista_Precios_Cliente(int idCliente, int idListaPrecio)
        {
            try
            {
                string Query = @"insert into dbo_Cat_Lista_Precios_Cliente
                                 (
                                 Id_Lista_Precios_Cliente,
                                 Id_Cliente,
                                 Id_Lista_Precios,
                                 Orden,
                                 Fecha_Alta,
                                 Usuario_Alta,
                                 Fecha_Mantto,
                                 Usuario_Mantto
                                 )  values 
                                 (
                                 IIF(DCount('*', 'dbo_Cat_Lista_Precios_Cliente') = 0, 1, DMax('Id_Lista_Precios_Cliente', 'dbo_Cat_Lista_Precios_Cliente') + 1),
                                 @Id_Cliente,
                                 @Id_Lista_Precios,
                                  IIF(DCount('*', 'dbo_Cat_Lista_Precios_Cliente','Id_Cliente =@Id_Cliente') = 0, 1, DMax('Orden', 'dbo_Cat_Lista_Precios_Cliente','Id_Cliente=@Id_Cliente') + 1),
                                 NOW(),
                                 '@Usuario_Alta',
                                 NOW(),
                                 '@Usuario_Mantto'
                                 )  ";
                Query = Query.Replace("@Id_Cliente", idCliente.ToString());
                Query = Query.Replace("@Id_Lista_Precios", idListaPrecio.ToString());
                Query = Query.Replace("@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception EX)
            {
                return new Respuesta(2, EX.Message);
            }


        }
        public Respuesta Insert_Lista_Precios_Sucursal(int idSucursal, int idListaPrecio)
        {
            try
            {
                string Query = @"insert into dbo_Cat_Lista_Precios_Sucursal
                                 (
                                 Id_Lista_Precios_Sucursal,
                                 Id_Sucursal,
                                 Id_Lista_Precios,
                                 Orden,
                                 Fecha_Alta,
                                 Usuario_Alta,
                                 Fecha_Mantto,
                                 Usuario_Mantto
                                 )  values 
                                 (
                                 IIF(DCount('*', 'dbo_Cat_Lista_Precios_Sucursal') = 0, 1, DMax('Id_Lista_Precios_Sucursal', 'dbo_Cat_Lista_Precios_Sucursal') + 1),
                                 @Id_Sucursal,
                                 @Id_Lista_Precios,
                                  IIF(DCount('*', 'dbo_Cat_Lista_Precios_Sucursal','Id_Sucursal=@Id_Sucursal') = 0, 1, DMax('Orden', 'dbo_Cat_Lista_Precios_Sucursal','Id_Sucursal=@Id_Sucursal') + 1),
                                 NOW(),
                                 '@Usuario_Alta',
                                 NOW(),
                                 '@Usuario_Mantto'
                                 )  ";
                Query = Query.Replace("@Id_Sucursal", idSucursal.ToString());
                Query = Query.Replace("@Id_Lista_Precios", idListaPrecio.ToString());
                Query = Query.Replace("@Usuario_Alta", this._Usuario);
                Query = Query.Replace("@Usuario_Mantto", this._Usuario);

                return SrvDB.ExecuteQuery_Insert(Query);
            }
            catch (Exception EX)
            {
                return new Respuesta(2, EX.Message);
            }


        }

       
        #endregion

        #region DELETE
        public Respuesta Delete_Lista_Precios_Por_Id(object Id_Lista_Precios)
        {
            try
            {
                string Query = @"DELETE 
                                FROM dbo_cat_lista_precios
                                WHERE Id_Lista_Precios = @Id_Lista_Precios
                                AND  Id_Lista_Precios not in 
                                (
                                    SELECT Id_Lista_Precios FROM dbo_cat_lista_precios_cliente 
                                )
                                AND  Id_Lista_Precios NOT IN
                                (
                                    SELECT Id_Lista_Precios FROM dbo_cat_lista_precios_sucursal
                                )";

                string Query3 = @"DELETE
                                  FROM dbo_cat_lista_precios_articulo_descuento
                                  WHERE id_lista_precios_articulo IN  (
                                    SELECT id_lista_precios_articulo 
                                    FROM dbo_cat_lista_precios_articulo
                                    WHERE id_lista_precios = @Id_Lista_Precios)";

                Query3 = Query3.Replace("@Id_Lista_Precios", ((Int32)Id_Lista_Precios).ToString());

                SrvDB.ExecuteQuery_Delete(Query3);
                Query = Query.Replace("@Id_Lista_Precios", ((Int32)Id_Lista_Precios).ToString());
                SrvDB.ExecuteQuery_Delete(Query);
                string Query2 = @"DELETE 
                                FROM dbo_cat_lista_precios_articulo
                                WHERE Id_Lista_Precios = @Id_Lista_Precios";

                Query2 = Query2.Replace("@Id_Lista_Precios", ((Int32)Id_Lista_Precios).ToString());
              
                return SrvDB.ExecuteQuery_Delete(Query2);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        public Respuesta Delete_Lista_Precios_Clientes_Por_Id(object Id_Lista_Precios_Clientes,object Id_Cliente)
        {
            try
            {
                string Query = @"DELETE 
                                 FROM dbo_cat_lista_precios_cliente
                                 WHERE Id_Lista_Precios_Cliente = @Id_Lista_Precios_Cliente  and Id_Cliente = @Id_Cliente";

                Query = Query.Replace("@Id_Lista_Precios_Cliente", ((Int32)Id_Lista_Precios_Clientes).ToString());
                Query = Query.Replace("@Id_Cliente", ((Int32)Id_Cliente).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        public Respuesta Delete_Lista_Precios_Sucursal_Por_Id(object Id_Lista_Precios_Sucursal, object Id_Sucursal)
        {
            try
            {
                string Query = @"DELETE 
                                 FROM dbo_cat_lista_precios_sucursal
                                 WHERE Id_Lista_Precios_sucursal = @Id_Lista_Precios_Sucursal  and Id_Sucursal = @Id_Sucursal";

                Query = Query.Replace("@Id_Lista_Precios_Sucursal", ((Int32)Id_Lista_Precios_Sucursal).ToString());
                Query = Query.Replace("@Id_Sucursal", ((Int32)Id_Sucursal).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        public Respuesta Delete_Lista_Precios_Articulo_Por_Id(object Id_Lista_Precios, object Id_Articulo)
        {
            try
            {
                string Query3 = @"DELETE
                                  FROM dbo_cat_lista_precios_articulo_descuento
                                  WHERE id_lista_precios_articulo IN  (
                                    SELECT id_lista_precios_articulo 
                                    FROM dbo_cat_lista_precios_articulo
                                    WHERE id_lista_precios = @Id_Lista_Precios)";

                Query3 = Query3.Replace("@Id_Lista_Precios", ((Int32)Id_Lista_Precios).ToString());

                SrvDB.ExecuteQuery_Delete(Query3);
                string Query = @"DELETE 
                                 FROM dbo_cat_lista_precios_articulo 
                                 WHERE  Id_Lista_Precios=@Id_Lista_Precios and
                                        Id_Articulo = @Id_Articulo";

                Query = Query.Replace("@Id_Lista_Precios", ((Int32)Id_Lista_Precios).ToString());
                Query = Query.Replace("@Id_Articulo", ((Int32)Id_Articulo).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }

        public Respuesta Delete_Lista_Precios_Articulo_Descuento_Por_Id(object Id_Lista_Precios_Articulo_Descuento, object Id_Lista_Precios_Articulo)
        {
            try
            {
                string Query = @"DELETE 
                                 FROM dbo_cat_lista_precios_articulo_descuento
                                 WHERE  Id_Lista_Precios_Articulo_Descuento = @Id_Lista_Precios_Articulo_Descuento and
                                        Id_Lista_Precios_Articulo = @Id_Lista_Precios_Articulo";

                Query = Query.Replace("@Id_Lista_Precios_Articulo_Descuento", ((Int32)Id_Lista_Precios_Articulo_Descuento).ToString());
                Query = Query.Replace("@Id_Lista_Precios_Articulo", ((Int32)Id_Lista_Precios_Articulo).ToString());
                return SrvDB.ExecuteQuery_Delete(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
       
        #endregion
        #region UPDATE
        public Respuesta Update_Orden_Lista_Precios_To_Cliente(int Id, int orden)
        {
            try
            {
                string Query = @"update dbo_cat_lista_Precios_Cliente
                                 set orden = @orden 
                                    where id_lista_Precios_cliente = @Id";


                Query = Query.Replace("@orden", orden.ToString());
                Query = Query.Replace("@Id", ((Int32)Id).ToString());
                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        public Respuesta Update_Orden_Lista_Precios_To_Sucursal(int Id, int orden)
        {
            try
            {
                string Query = @"update dbo_cat_lista_Precios_Sucursal
                                 set orden = @orden 
                                    where id_lista_Precios_sucursal = @Id";


                Query = Query.Replace("@orden", orden.ToString());
                Query = Query.Replace("@Id", ((Int32)Id).ToString());
                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        public Respuesta Update_Lista_Precios(int Id_Lista_Precios, string Nombre, string Descripcion)
        {
            try
            {
                string Query = @"UPDATE dbo_cat_lista_Precios
                                 SET Nombre = '@Nombre' , Descripcion = '@Descripcion'
                                 WHERE Id_Lista_Precios = @Id_Lista_Precios";


                Query = Query.Replace("@Nombre", Nombre.ToString().Replace("'", "''"));
                Query = Query.Replace("@Descripcion", Descripcion.ToString().Replace("'", "''"));
                Query = Query.Replace("@Id_Lista_Precios", Id_Lista_Precios.ToString());

                return SrvDB.ExecuteQuery_Update(Query);
            }
            catch (Exception Ex)
            {
                return new Respuesta(2, Ex.Message);
            }
        }
        #endregion
    }
}
